package org.tabularium.net.linkdb;

import java.util.*;

/**
 * Stores Urls in db while keeps links in memory for fast access. 
 * 
 * @author Fabio Gasparetti
 *
 */
public class UrlSqlLinkDb extends SqlLinkDb {
//
//	// for each url gives the indexes in inLinks and outLinks arrays
//	class Indexes {
//		int idxInLinks;
//		short numInLinks; 
//		int idxOutLinks;
//		short numOutLinks; 
//	}
//	Indexes linkArrayIndexes[] = null;
//
//	// map an incremental index (internal id) to the idUrl (stored in the db) 
//	int idUrlArrayIndexMap[] = null;
//	// list of in links
//	int inLinks[] = null;
//	// list of out links
//	int outLinks[] = null;
//	
//		
//	@Override
//	public void addLink(String url, String link) throws LinkDbException {
//		int urlId = this.urlId(url);
//		int id = Arrays.binarySearch(idUrlArrayIndexMap, urlId);
//		if ()
//
//		// TODO Auto-generated method stub
//		super.addLink(url, link);
//	}
//
//	@Override
//	public void addLinks(String url, Collection links) throws LinkDbException {
//		// TODO Auto-generated method stub
//		super.addLinks(url, links);
//	}
//
//	@Override
//	public UrlIterator browse() throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.browse();
//	}
//
//	@Override
//	public void clear() throws LinkDbException {
//		// TODO Auto-generated method stub
//		super.clear();
//	}
//
//	@Override
//	public List inLinks(String url) throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.inLinks(url);
//	}
//
//	@Override
//	public int linkId(String url, String link) throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.linkId(url, link);
//	}
//
//	@Override
//	public List outLinks(String url) throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.outLinks(url);
//	}
//
//	@Override
//	public void removeLink(String url, String link) throws LinkDbException {
//		// TODO Auto-generated method stub
//		super.removeLink(url, link);
//	}
//
//	@Override
//	public int size() throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.size();
//	}
//
//	@Override
//	public String[] urlsByLinkId(int linkId) throws LinkDbException {
//		// TODO Auto-generated method stub
//		return super.urlsByLinkId(linkId);
//	}
//
//	protected UrlSqlLinkDb() {
//	}
//	
//	public void load() throws LinkDbException {
//		int numUrls, numLinks;
//		numUrls = linkDb.numUrls();
//		numLinks = linkDb.size();
//		// allocate memory
//		this.idUrlArrayIndexMap = new int[numUrls];
//		this.linkArrayIndexes = new Indexes[numUrls];
//		for (int i = 0; i < this.linkArrayIndexes.length; i++)
//			this.linkArrayIndexes[i] = new Indexes();
//		this.outLinks = new int[numLinks];
//		this.inLinks = new int[numLinks];
//		// populate
//		String url;
//		int idUrl;
//		int currIdx = 0;
//		int currOutArrayIdx = 0;
//		int currInArrayIdx = 0;
//		List outLinks;
//		List inLinks;
//		Iterator iter1;
//		UrlIterator iter = linkDb.browse();
//		while (iter.hasNext()) {
//			if (currIdx%100 == 0)
//				System.out.println("loading: "+currIdx);
//			url = (String)iter.next();
//			idUrl = linkDb.urlId(url);
//			idUrlArrayIndexMap[currIdx] = idUrl;
//			outLinks = linkDb.outLinks(url);
//			inLinks = linkDb.inLinks(url);
//			linkArrayIndexes[currIdx].idxInLinks = currInArrayIdx;
//			linkArrayIndexes[currIdx].numInLinks = inLinks.size() > Short.MAX_VALUE ? Short.MAX_VALUE : (short)inLinks.size();
//			linkArrayIndexes[currIdx].idxOutLinks = currOutArrayIdx;
//			linkArrayIndexes[currIdx].numOutLinks = outLinks.size() > Short.MAX_VALUE ? Short.MAX_VALUE : (short)outLinks.size();
//			iter1 = outLinks.iterator();
//			while (iter1.hasNext()) {
//				url = (String)iter1.next();
//				idUrl = linkDb.urlId(url);
//				this.outLinks[currOutArrayIdx++] = idUrl;
//			}
//			iter1 = inLinks.iterator();
//			while (iter1.hasNext()) {
//				url = (String)iter1.next();
//				idUrl = linkDb.urlId(url);
//				this.inLinks[currInArrayIdx++] = idUrl;
//			}			
//			currIdx++;
//		}
//		// convert idUrls to (internal) ids
//		for (int i = 0; i < numLinks; i++) {
//			 this.inLinks[i] = Arrays.binarySearch(idUrlArrayIndexMap, this.inLinks[i]);
//			 this.outLinks[i] = Arrays.binarySearch(idUrlArrayIndexMap, this.outLinks[i]);
//		}
//
//	}
//
//
//	public static void main(String[] args) {
//		SqlLinkDb q = null;
//		try {
//			q = new SqlLinkDb();
//			q.init("com.mysql.jdbc.Driver",
//					"jdbc:mysql://127.0.0.1/crawler_data?user=root",
//					"jdbc:mysql://127.0.0.1/mysql?user=root", "crawler_data",
//					true);
//			int nl = 100000000;
//			for (int i = 0; i < nl; i++) {
//				int id1 = (int)(Math.random()*nl/10);
//				int id2 = (int)(Math.random()*nl/10);
//				q.addLink(Integer.toString(id1), Integer.toString(id2));
//				if (i%1000==0)
//					System.out.println(q.size());
//				if (i%10000==0) {
//					LinkDbHITS hits = new LinkDbHITS(q);
//					System.out.println(System.currentTimeMillis()/1000);
//					System.out.println("loading...");
//					hits.load(); 
//					System.out.println(System.currentTimeMillis()/1000);
//					System.out.println("calculating...");
//					hits.calculate();
//					System.out.println(System.currentTimeMillis()/1000);
//					System.out.println("stopped");
//
//					UrlIterator iter = q.browse();
//					while (iter.hasNext()) {
//						String url = (String)iter.next();
//						System.out.print(url+" auth:"+hits.getAuth(url)+" hub:"+hits.getHub(url)+"\t");
//					}
//				}
//			}
////				List l1 = q.inLinks("3");
////				Iterator i1 = l1.iterator();
////				while (i1.hasNext()) {
////					String u = (String)(i1.next());
////					System.out.print(u+" ");
////				}
////				List l2 = q.outLinks("1");
////				i1 = l2.iterator();
////				while (i1.hasNext()) {
////					String u = (String)(i1.next());
////					System.out.print(u+" ");
////				}
////				System.out.println(" size2: "+q.size());
//			//hits.ranker.printRankings(true, true);
//
//		} catch (Exception ex) {
//			System.out.println(ex.toString());
//			ex.printStackTrace();
//		}
//
//	}
//
//	
}

